package com.c2b.algorithm.leetcode.jzoffer;

import java.util.HashMap;
import java.util.Map;

/**
 * <a href="https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&&tqId=11187&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking">第一个只出现一次的字符</a>
 *
 * <p>在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1（需要区分大小写）.（从0开始计数）</p>
 * <p>数据范围：0≤n≤10000，且字符串只有字母组成。</p>要求：空间复杂度O(n)，时间复杂度O(n)
 *
 * @author c2b
 * @since 2023/3/8 9:55
 */
public class JzOffer0050FirstNotRepeatingChar {

    /**
     * 遍历一次字符串，对于每个字符，放入哈希表中统计出现次数。<br>
     * 再次遍历字符串，对于每个字符，检查哈希表中出现次数是否为1，找到第一个即可。<br>
     * 遍历结束都没找到，那就是没有，返回-1.
     */
    public int FirstNotRepeatingChar(String str) {
        // 健壮性检验
        if (str == null || str.length() == 0) {
            return -1;
        }
        // 字符串只有字母组成并区分大小写，共52个
        Map<Character, Integer> characterIntegerMap = new HashMap<>(64);
        char[] chars = str.toCharArray();
        for (char aChar : chars) {
            Integer integer = characterIntegerMap.getOrDefault(aChar, 0);
            characterIntegerMap.put(aChar, integer + 1);
        }
        for (int i = 0; i < chars.length; i++) {
            if (characterIntegerMap.get(chars[i]) == 1) {
                return i;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        JzOffer0050FirstNotRepeatingChar jzOffer0050FirstNotRepeatingChar = new JzOffer0050FirstNotRepeatingChar();
        System.out.println(jzOffer0050FirstNotRepeatingChar.FirstNotRepeatingChar("aa"));
    }

}
